package org.xmap.ui.control;

import javax.microedition.lcdui.Graphics;

import org.xmap.app.Env;
import org.xmap.ui.Theme;
import org.xmap.ui.UIUtil;
import org.xmap.ui.base.Event;
import org.xmap.ui.base.Window;

/**
 * <p>标签控件，例如显示在一个视图的顶部标题栏就是一个标签控件。</p>
 * @author Zealot
 * @version 1.0
 */
public final class Label extends Window {

    /**
     * 标签的文字。
     */
    private String text;
    /**
     * 标签的文字的颜色。
     */
    private int textColor;
    /**
     * 边框的颜色。
     */
    private int lineColor;
    /**
     * 标签文字的横向偏移，用于调整标签文字的位置，只对于左对齐或右对齐有用。
     */
    private int offset;

    /**
     * 指定标签文字、标签坐标和宽高的构造函数。
     * @param text String 标签文字。
     * @param leftUpX int 标签左上角的横坐标。
     * @param leftUpY int 标签左上角的纵坐标。
     * @param width int 标签宽度。
     * @param height int 标签高度。
     */
    public Label(String text, int leftUpX, int leftUpY, int width, int height) {
        this(text, leftUpX, leftUpY, width, height, Window.ORIENT_LEFT_UP);
    }

    /**
     * 指定标签文字、标签的锚点坐标、标签宽高和锚点类型的构造函数。
     * @param text String 标签文字。
     * @param x int 标签的锚点的横坐标。
     * @param y int 标签的锚点的纵坐标。
     * @param width int 标签的宽度。
     * @param height int 标签的高度。
     * @param orient int 锚点的类型。
     */
    public Label(String text, int x, int y, int width, int height, int orient) {
        super(x, y, width, height, orient);
        this.setText(text);
        this.textColor = 0xff000000;
        this.lineColor = Theme.instance.defaultLineColor;
        this.setTextAlignCenter(true);
        super.setShowRect(true);
        this.setBackgroundTransparent(false);
        this.offset = 0;
    }

    /**
     * 设置标签的文字。
     * @param text String 标签文字。
     */
    public void setText(String text) {
        this.text = text;
    }

    /**
     * 获得标签的文字。
     * @return String 标签文字。
     */
    public String getText() {
        return this.text;
    }

    /**
     * 设置标签文字的颜色。
     * @param color int 标签文字的颜色。
     */
    public void setTextColor(int color) {
        this.textColor = color;
    }

    /**
     * 获得标签文字的颜色。
     * @return int 标签文字的颜色。
     */
    public int getTextColor() {
        return this.textColor;
    }

    /**
     * 设置边框的颜色。
     * @param lineColor int 边框的颜色。
     */
    public void setLineColor(int lineColor) {
        this.lineColor = lineColor;
    }

    /**
     * 获得边框的颜色。
     * @return int 边框的颜色。
     */
    public int getLineColor() {
        return this.lineColor;
    }

    public void setBackgroundTransparent(boolean transparent) {
        if (transparent) {
            this.state |= Window.STATE_BACKGROUND_TRANSPARENT;
        } else {
            this.state &= ~Window.STATE_BACKGROUND_TRANSPARENT;
        }
    }

    public boolean getBackgroundTransparent() {
        return (super.state & Window.STATE_BACKGROUND_TRANSPARENT) != 0;
    }

    public void setTextAlignCenter(boolean center) {
        if (center) {
            this.state |= Window.STATE_TEXT_ALIGN_CENTER;
        } else {
            this.state &= ~Window.STATE_TEXT_ALIGN_CENTER;
        }
    }

    public boolean getTextAlignCenter() {
        return (super.state & Window.STATE_TEXT_ALIGN_CENTER) != 0;
    }

    public void setTextAlignLeft(boolean left) {
        this.setTextAlignCenter(false);
        if (left) {
            this.state |= Window.STATE_TEXT_ALIGN_LEFT;
        } else {
            this.state &= ~Window.STATE_TEXT_ALIGN_LEFT;
        }
    }

    public boolean getTextAlignLeft() {
        return (super.state & Window.STATE_TEXT_ALIGN_LEFT) != 0;
    }

    /**
     * 设置标签文字的横向偏移。
     * @param offset int 标签文字的横向偏移。
     */
    public void setOffset(int offset) {
        this.offset = offset;
    }

    /**
     * 获得标签文字的横向偏移。
     * @return int 标签文字的横向偏移。
     */
    public int getOffset() {
        return this.offset;
    }

    /**
     * 绘制函数。
     * @param g Graphics 图形句柄。
     */
    public void draw(Graphics g) {
        g.setFont(Env.instance.defaultFont);
        if (!this.getBackgroundTransparent()) {
            g.setColor(Theme.instance.titleBackgroundColor);
            g.fillRect(0, 0, this.getRect().width, this.getRect().height);
        }
        if (Theme.instance.titleBackground != null) {
            if (super.getBackgroundImageStretch() || super.getBackgroundImageCenter()) {
                g.drawImage(Theme.instance.titleBackground, this.getRect().width >> 1,
                            this.getRect().height >> 1, Graphics.VCENTER | Graphics.HCENTER);
            } else {
                for (int i = 0; i < this.getRect().width; i += this.bgImage.getWidth()) {
                    for (int j = 0; j < this.getRect().height; j += this.bgImage.getHeight()) {
                        g.drawImage(Theme.instance.titleBackground, i, j, Graphics.LEFT | Graphics.TOP);
                    }
                }
            }
        }
        if (this.text != null) {
            g.setColor(Theme.instance.titleTextColor);
            if (this.getTextAlignCenter()) {
                UIUtil.draw(g, this.text, this.getRect().width >> 1, this.getRect().height >> 1,
                            Graphics.HCENTER, Graphics.VCENTER);
            } else if (this.getTextAlignLeft()) {
                UIUtil.draw(g, this.text, this.offset, this.getRect().height >> 1, Graphics.LEFT, Graphics.VCENTER);
            } else {
                UIUtil.draw(g, this.text, this.getRect().width - this.offset, this.getRect().height >> 1, Graphics.RIGHT, Graphics.VCENTER);
            }
        }
        if (this.getShowRect()) {
            g.setColor(Theme.instance.defaultLineColor);
            g.drawRect(0, 0, this.getRect().width - 1, this.getRect().height - 1);
        }
    }

    /**
     * Label控件不处理任何按键消息。
     * @param flag boolean 是按下还是抬起。
     * @param keyCode int 按键代码。
     * @param gameAction int 动作代码。
     * @return boolean 是否处理该事件。
     */
    public boolean keyEvent(boolean flag, int keyCode, int gameAction) {
        return false;
    }

    /**
     * 触笔事件处理函数，在Label区域内的触笔事件都被处理。
     * @param ev Event 触笔事件。
     * @return boolean 是否处理该事件。
     */
    public boolean pointerEvent(Event ev) {
        if (this.getRect().collideWith(ev.param1, ev.param2)) {
            return true;
        }
        return false;
    }
}
